/*
 * SBSL per il momento non organizzato
 * ma con distinte interfacce remote (in base alle responsabilita)
 *
 * 
 */

package to.pm.magazzino.ejb;

import java.util.Collection;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.annotation.PostConstruct;

import java.util.List;

import java.util.Map;
import java.util.logging.Logger;
import javax.persistence.Query;
import to.pm.entity.magazzino.DisponibilitaProdotto;
import to.pm.entity.magazzino.Prelievo;
import to.pm.entity.catalogo.ProdottoConsumabile;

import to.pm.magazzino.bi.GestioneMagazzinoBusiness;
import to.pm.magazzino.bi.GestioneProdottoBusiness;

import to.pm.magazzino.core.CaricoMagazzino;
import to.pm.magazzino.core.GestioneCollocazioni;
import to.pm.magazzino.core.GestioneMagazzini;
import to.pm.magazzino.core.GestioneProdotti;

import to.pm.entity.magazzino.Collocazione;
import to.pm.entity.magazzino.Magazzino;
import to.pm.entity.magazzino.Stock;

import to.pm.ejb.EjbName;

/* nb. con 2 o piu' remote interface glassfish non assegna
 * un global jndi name di default, ma bisogna invece per forza
 * esplicitare un nome.
 * nb2. non esistono standards solo convenzioni...
 * e differenti application server possono decidere diversamente...
 */
@Stateless(name=EjbName.MagazziniereBean, mappedName=EjbName.MagazziniereBean)
public class AzioniMagazziniereBean     
        implements GestioneProdottoBusiness,
                   GestioneMagazzinoBusiness {

    @PersistenceContext
    private EntityManager em;


    Logger log = Logger.getLogger(AzioniMagazziniereBean.class.getName());

    //se le classi helper (in core) dovessero essere "statefull"
    //bisogna cambiare l'inizializzazione cosi' da creare
    //delle nuove classi ad ogni invocazione del slsb
    private CaricoMagazzino carico = null ;
    private GestioneProdotti gestioneProdotti = null;
    private GestioneCollocazioni gestioneCollocazioni = null;
    private GestioneMagazzini gestioneMagazzini = null;

    

    @PostConstruct
    private void initHelper(){
        carico = new CaricoMagazzino();
        carico.setEm(em);
        gestioneProdotti = new GestioneProdotti();
        gestioneProdotti.setEm(em);
        gestioneCollocazioni = new GestioneCollocazioni();
        gestioneCollocazioni.setEm(em);
        gestioneMagazzini = new GestioneMagazzini();
        gestioneMagazzini.setEm(em);
    }



    public Magazzino createMagazzino(Magazzino magazzino) {
        log.info("createMagazzino("+ magazzino +")");
        gestioneMagazzini.addMagazzino(magazzino);
        return magazzino;
    }

    public Collocazione createCollocazione(Collocazione collocazione) {
        log.info("createCollocazione("+ collocazione +")");
        gestioneCollocazioni.addCollocazione(collocazione);
        return collocazione;
    }

    public Stock addStock(ProdottoConsumabile p, Stock s, List<DisponibilitaProdotto> d) {
        return gestioneProdotti.addStock(p, s, d);
    }

    public void addPrelievo(Stock s, DisponibilitaProdotto d, Prelievo p) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Collection<Collocazione> findAllCollocazioni() {
        Query createQuery = em.createQuery("select object(o) from Collocazione as o");
        return (Collection<Collocazione>) createQuery.getResultList() ;
    }

    public Map findAllCollocazioniMap() {
        Map m = new java.util.Hashtable();
        for (Collocazione c:findAllCollocazioni())
        {m.put(c.getDescrizione(),c.getId());
         log.info(c.getId()+" "+c.getDescrizione());}
        m.put("Da collocare", 0);
        return m;
    }

    public Collection<DisponibilitaProdotto> findDisponibilitaByCollocazione(Long idCollocazione) {
        Query createQuery;
        if (idCollocazione!=null)
        {createQuery=em.createQuery("select object(o) from DisponibilitaProdotto as o where o.collocazione = ?1");
         createQuery.setParameter(1, idCollocazione);
       }
        else
        {createQuery=em.createQuery("select object(o) from DisponibilitaProdotto as o where o.collocazione is null");
        }
        return (Collection<DisponibilitaProdotto>) createQuery.getResultList() ;
    }

    public Map findDisponibilitaByCollocazioneMap(Long id) {
        Map m = new java.util.Hashtable();
        for (DisponibilitaProdotto c:findDisponibilitaByCollocazione(id))
        {m.put(c.toString(),c.getId());
         log.info(c.getId()+" "+c.toString());}
        return m;
    }

}
